import axios from "axios";
import { ElMessage } from "element-plus";
import router from "@/router";
import { useAuthStore } from "@/store";
const api = axios.create({
    baseURL: "http://127.0.0.1:4523/m1/5331766-5002448-default/api", // 基础路径前缀
    withCredentials: true,
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
});

const defaultError = () => ElMessage.error('发生了一些错误，请联系管理员')
const defaultFailure = (message) => ElMessage.warning(message)

// 请求拦截器 - 添加 JWT 认证头
api.interceptors.request.use(
    (config) => {
        const store = useAuthStore();
        const token = store.accessToken; // 从 store 获取 token
        if (token) {
            config.headers.Authorization = `Bearer ${token}`; // 将 token 添加到请求头
        }
        return config;
    },
    (error) => {
        return Promise.reject(error); // 请求失败时，返回错误
    }
);

// 响应拦截器 - 处理认证错误（比如 token 过期）
api.interceptors.response.use(
    (response) => {
        if (response.data.code == 401) {
            const store = useAuthStore();
            console.log('token invalid');
            store.clearToken(); // 清除无效的 token
            router.push("/"); // 跳转到登录页面
        }
        return response; // 正常响应直接返回
    },
    async (error) => {
        if (error.response && error.response.status == 401) {
            // 如果是 401 错误（未授权）
            const store = useAuthStore();
            console.log('token invalid');
            store.clearToken(); // 清除无效的 token
            router.push("/") // 跳转到登录页面
        }
        // 默认处理
        return Promise.reject(error); // 返回错误
    }
);

function post (path, data, success, failure = defaultFailure, error = defaultError) {
    api.post(path, data, {
    }).then(({ data }) => {
        if (data.code == 0)
            success(data)
        else
            failure(data)
    }).catch(error)
}

function get (path, params, success, failure = defaultFailure, error = defaultError) {
    api.get(path, {
        withCredentials: true,
        params: params
    }).then(({ data }) => {
        if (data.code == 0)
            success(data)
        else
            failure(data)
    }).catch(error)
}

function put (path, data, success, failure = defaultFailure, error = defaultError) {
    api.put(path, data, {})
        .then(({ data }) => {
            if (data.code == 0)
                success(data)
            else
                failure(data)
        }).catch(error)
}

export { get, post, put }